package br.com.fogas.webservice.parser.notafiscal;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.com.fogas.utils.FogasUtility;

public class NotaFiscalRequestBuilder {
	
	private NotaFiscalEnvelope envelope;
	
	private NotaFiscalRequest request;
	
	private NotaRequest notaRequest;
	
	private List<NotaRequestBody> notaFiscais;

	private NotaItemRequest notaItemRequest;

	private List<NotaItemRequestBody> itemsNota;

	private NotaItemCondicaoRequest notaItemCondicaoRequest;
	
	private List<NotaItemCondicaoRequestBody> condicoesItemsNota;
	
	/**
	 * 
	 * Nota Fiscal
	 * 
	 */
	private String nfNum;
	
	private String nfSerie;
	
	private String data;
	
	private String condPgto;
	
	private String codCliente;
	
	private String cancelada;
	
	private String pesoBruto;
	
	private String pesoLiquido;
	
	private String nossoNumero;
	
	private String numEmbarque;
	
	private String canal;
	
	private String setor;
	
	private String valorNota;
	
	private String contigencia;
	
	private String hora;
	
	private String codBateria;
	
	private String boletoMedicao;
	
	private String ordemCriada;
	
	private String vencimento;
	
	private String chave;
	
	private String medidor;
	
	private String leituraAtual;
	
	private String qrCodeLido;
	
	private String plano;
	
	public NotaFiscalRequestBuilder() {
		this.notaFiscais = new ArrayList<NotaRequestBody>();
		this.notaRequest = new NotaRequest();
		this.notaRequest.setItems(notaFiscais);
		
		this.itemsNota = new ArrayList<NotaItemRequestBody>();
		this.notaItemRequest = new NotaItemRequest();
		this.notaItemRequest.setItems(itemsNota);
		
		this.condicoesItemsNota = new ArrayList<NotaItemCondicaoRequestBody>();
		this.notaItemCondicaoRequest = new NotaItemCondicaoRequest();
		this.notaItemCondicaoRequest.setItems(condicoesItemsNota);
		
		this.request = new NotaFiscalRequest();
		this.request.setNotaFiscal(notaRequest);
		this.request.setNotaItem(notaItemRequest);
		this.request.setNotaCondicao(notaItemCondicaoRequest);
	}
	
	public NotaFiscalEnvelope envelope(NotaFiscalRequest request) {
		this.envelope = new NotaFiscalEnvelope();
		this.envelope.body.request = request;
		return this.envelope;
	}
	
	public NotaFiscalRequest request() {
		return request;
	}
	
	public NotaFiscalRequestBuilder adicionarNota() {
		NotaRequestBody nota = new NotaRequestBody();
		nota.setNfNum(nfNum);
		nota.setNfSerie(nfSerie);
		nota.setData(data);
		nota.setCondPgto(condPgto);
		nota.setCodCliente(codCliente);
		nota.setCancelada(cancelada);
		nota.setPesoBruto(pesoBruto);
		nota.setPesoLiquido(pesoLiquido);
		nota.setNossoNumero(nossoNumero);
		nota.setNumEmbarque(numEmbarque);
		nota.setCanal(canal);
		nota.setSetor(setor);
		nota.setValorNota(valorNota);
		nota.setContigencia(contigencia);
		nota.setHora(hora);
		nota.setCodBateria(codBateria);
		nota.setBoletoMedicao(boletoMedicao);
		nota.setOrdemCriada(ordemCriada);
		nota.setVencimento(vencimento);
		nota.setChave(chave);
		nota.setMedidor(medidor);
		nota.setLeituraAtual(leituraAtual);
		nota.setQrCodeLido(qrCodeLido);
		nota.setPlano(plano);
		this.notaFiscais.add(nota);
		return this;
	}
	
	public NotaFiscalRequestBuilder adicionaItem(NotaItemRequestBody notaItem) {
		this.itemsNota.add(notaItem);
		return this;
	}  
	
	public NotaFiscalRequestBuilder adicionaCondicao(NotaItemCondicaoRequestBody condicaoItem) {
		this.condicoesItemsNota.add(condicaoItem);
		return this;
	}
	
	/**
	 *****************************************************************
	 * NOTA FISCAL CABECALHO
	 ***************************************************************** 
	 *
	 */

	public NotaFiscalRequestBuilder nfNum(String nfNum) {
		this.nfNum = nfNum;
		return this;
	}

	public NotaFiscalRequestBuilder nfSerie(String nfSerie) {
		this.nfSerie = nfSerie;
		return this;
	}

	public NotaFiscalRequestBuilder data(Date data) {
		this.data = FogasUtility.sap.convertDateForSAP(data);
		return this;
	}

	public NotaFiscalRequestBuilder condPgto(String condPgto) {
		this.condPgto = condPgto;
		return this;
	}

	public NotaFiscalRequestBuilder codCliente(String codCliente) {
		this.codCliente = FogasUtility.sap.convertIntegerForSAP_10Digits(Integer.valueOf(codCliente));
		return this;
	}

	public NotaFiscalRequestBuilder cancelada(boolean cancelada) {
		this.cancelada = FogasUtility.sap.convertBooleanForSAP(cancelada);
		return this;
	}

	public NotaFiscalRequestBuilder pesoBruto(double pesoBruto) {
		this.pesoBruto = FogasUtility.sap.convertDecimalForSAP(pesoBruto);
		return this;
	}

	public NotaFiscalRequestBuilder pesoLiquido(double pesoLiquido) {
		this.pesoLiquido = FogasUtility.sap.convertDecimalForSAP(pesoLiquido);
		return this;
	}

	public NotaFiscalRequestBuilder nossoNumero(String nossoNumero) {
		this.nossoNumero = nossoNumero;
		return this;
	}

	public NotaFiscalRequestBuilder numEmbarque(String numEmbarque) {
		this.numEmbarque = numEmbarque;
		return this;
	}

	public NotaFiscalRequestBuilder canal(String canal) {
		this.canal = canal;
		return this;
	}

	public NotaFiscalRequestBuilder setor(String setor) {
		this.setor = setor;
		return this;
	}

	public NotaFiscalRequestBuilder valorNota(double valorNota) {
		this.valorNota = FogasUtility.sap.convertDecimalForSAP(valorNota);
		return this;
	}

	public NotaFiscalRequestBuilder contigencia(boolean contigencia) {
		this.contigencia = FogasUtility.sap.convertBooleanForSAP(contigencia);
		return this;
	}

	public NotaFiscalRequestBuilder hora(Date hora) {
		this.hora = FogasUtility.sap.convertTimeForSAP(hora);
		return this;
	}

	public NotaFiscalRequestBuilder codBateria(String codBateria) {
		this.codBateria = codBateria;
		return this;
	}

	public NotaFiscalRequestBuilder boletoMedicao(String boletoMedicao) {
		this.boletoMedicao = boletoMedicao;
		return this;
	}

	public NotaFiscalRequestBuilder ordemCriada(String ordemCriada) {
		this.ordemCriada = ordemCriada;
		return this;
	}

	public NotaFiscalRequestBuilder vencimento(Date vencimento) {
		this.vencimento = FogasUtility.sap.convertDateForSAP(vencimento);
		return this;
	}

	public NotaFiscalRequestBuilder chave(String chave) {
		this.chave = chave;
		return this;
	}

	public NotaFiscalRequestBuilder medidor(String medidor) {
		this.medidor = medidor;
		return this;
	}

	public NotaFiscalRequestBuilder leituraAtual(String leituraAtual) {
		this.leituraAtual = leituraAtual;
		return this;
	}

	public NotaFiscalRequestBuilder qrCodeLido(boolean qrCodeLido) {
		this.qrCodeLido = FogasUtility.sap.convertBooleanForSAP(qrCodeLido);
		return this;
	}
	
	public NotaFiscalRequestBuilder plano(String plano) {
		this.plano = plano;
		return this;
	}
}